package com.gitee.ed.structure.map;

import java.util.HashMap;
import java.util.Map;

/**
 * 类与对应实例的特殊 HashMap 结构
 * 具有类型自动转换功能
 *
 * @author hongda.li
 */
public class ClassMap extends HashMap<Class<?>, Object> {

    public ClassMap() {
        this(8);
    }

    public ClassMap(int initialCapacity) {
        super((int) (initialCapacity / 0.75F) + 1);
    }

    public ClassMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
    }

    public ClassMap(Map<Class<?>, Object> otherMap) {
        super(otherMap);
    }

    /**
     * 获取指定类型对应的实例
     * 若实例不存在则返回空
     *
     * @param clazz      指定类型
     * @param <Instance> 指定类型的泛型
     * @return 指定类型对应的实例
     */
    public <Instance> Instance getInstance(Class<Instance> clazz) {
        return this.getInstance(clazz, null);
    }

    /**
     * 获取指定类型对应的实例
     * 若实例不存在则返回默认实例4
     * 该实例不会被二次添加至容器中
     *
     * @param clazz      指定类型
     * @param <Instance> 指定类型的泛型
     * @return 指定类型对应的实例
     */
    public <Instance> Instance getInstance(Class<Instance> clazz, Instance defaultInstance) {
        Object instance = this.get(clazz);
        return instance == null ? defaultInstance : clazz.cast(instance);
    }
}
